#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：get_ftp_data.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/6/19 下午3:27 
"""

from ftplib import FTP
import os
import re

sum1 = 0
sum2 = 0
value = 0


# 遍历获取FTP 上面的目录
def search_dir(ftp, start_dir):
	FTP_Dir_l = []
	ftp.cwd(start_dir)
	FTP_Dir_l.append(ftp.pwd())
	dir_res = []
	ftp.dir('.', dir_res.append)  # 对当前目录进行dir()，将结果放入列表
	for i in dir_res:
		if i.startswith("d"):
			global sum1
			sum1 += 1
			search_dir(ftp, ftp.pwd() + "/" + i.split(" ")[-1])
			ftp.cwd('..')
		else:
			global sum2, value
			sum2 += 1
			val = i.split(" ")[-1]
			value += ftp.size(val)
	return FTP_Dir_l


# 遍历获取FTP 上面的文件
def search_file(ftp, Dir_path):
	Ftp_file_l = []
	FTP_Dir_l = search_dir(ftp, Dir_path)
	for Server_f_l in FTP_Dir_l:
		file_list = ftp.nlst(Server_f_l)
		for Server_file in file_list:
			if Server_file not in FTP_Dir_l:
				Ftp_file_l.append(Server_file)  # 将文件添加到列表
	return FTP_Dir_l, Ftp_file_l


def get_ftp_data():
	"""
	从ftp服务器下载文件
	:return:
	"""
	ftp = FTP()
	ftp.connect('host', 30001)
	ftp.login('usr', 'passwd')
	Server_path = "/opt/test"
	Client_path = "./manual_plan"
	if re.search(r".*/$", Server_path):
		pass
	else:
		Server_path = Server_path + "/"

	# 判断本地路径是否存在
	if os.path.exists(Client_path):
		print(f"{Client_path},不存在，将创建")
		os.makedirs(Client_path)
		print(f"{Client_path},创建成功")

	# 遍历获取FTP 上面的文件
	FTP_Dir_l, Ftp_file_l = search_file(Server_path)

	# 检测本地目录是否存在
	os.chdir(Client_path)
	for local_dir in FTP_Dir_l:
		if os.path.isdir(local_dir.split(Server_path, 1)[-1]):
			pass
		else:
			print(local_dir.split(Server_path, 1)[-1], "：本地不存在此目录，将创建")
			os.makedirs(local_dir.split(Server_path, 1)[-1])

	# 进行文件下载操作
	for Get_f in Ftp_file_l:
		print(Get_f, "将被下载到本地的", Client_path + os.sep + Get_f.split(Server_path, 1)[-1])
		fp = open(Client_path + os.sep + Get_f.split(Server_path, 1)[-1], 'wb')
		ftp.retrbinary('RETR ' + Get_f, fp.write, 1024)
	ftp.close()  # 退出连接
	print("文件下载完成")


if __name__ == '__main__':
	get_ftp_data()
